/*
    simplecookbook  -  simplecookbook.database.SQLliteLocalHostDatabaseConnection.java
                             -------------------
    begin                : 08/10/2008
    copyright            : (C) 2008 by cristovao
    email                : cristovao.wollieson@gmail.com
 ***************************************************************************/

/*
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful, but   *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
 *   General Public License for more details.                              *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,   *
 *   MA  02111-1307 USA                                                    *
 ***************************************************************************/

/**
 * Pacote responsavel por controla o banco de dados
 * 
 * @author cristovao
 */
package org.ybacoby.simplecookbook.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.ybacoby.simplecookbook.exception.SimpleCookBookException;



/**
 * Classe que se comunica com o um banco de dados do tipo
 * SQLite
 * 
 * @author cristovao
 *
 */
public class SQLliteLocalHostDatabaseConnection implements IDataBase {

	/**
	 * O driver que sera usado para se comunicar com o banco de dados
	 */
	private final String STR_DRIVER = "org.sqlite.JDBC";

	/**
	 * Banco de dados que fara a conexao
	 */
	//private final String DATABASE = "dbcookbook";
	private String DATABASE;
	
	private final String jdbcConnection = "jdbc:sqlite:";

	/**
	 * O Driver JDBC que sera usado para a conexao, no caso
	 * usando o banco de dados mysql
	 */
	private String STR_CON;

	/**
	 * Comando para a conexao
	 */
	private Connection con = null;

	/**
	 * Para controle das tabelas no banco de dados
	 */
	private Statement stmt;
	
	/**
	 * Constructor
	 *
	 * @param database
	 */
	public SQLliteLocalHostDatabaseConnection(String database) {
		this.DATABASE = database;
		
		this.STR_CON = this.jdbcConnection + this.DATABASE;
	}

	/**
	 * @see org.ybacoby.simplecookbook.database.IDataBase#closerDataBase()
	 */
	public void closerDataBase() throws SimpleCookBookException {
		try {
			// Fechando a conexao com o banco de dados
			if (this.con != null)
				this.con.close();

			// Fechando o estado de uso do banco de dados
			if (this.stmt != null)
				this.stmt.close();
		} catch (SQLException e) {
			// Caso nao seja possive fechar nenhuma das comunicacoes
			throw new SimpleCookBookException();
		}
	}

	/**
	 * @see org.ybacoby.simplecookbook.database.IDataBase#connectDataBase()
	 */
	public void connectDataBase() throws SimpleCookBookException {
		// Avisando que esta inicializando a comunicacao
		System.out.println("[ConnectionManager] - Inicializando o driver...");
		
		// Verificando se existe algum driver atuando
		try {
			Class.forName(STR_DRIVER);
		} catch (ClassNotFoundException e) {
			throw new SimpleCookBookException();
		}
		
		// Caso tudo o driver esteja em funcionamento
		System.out
				.println("[ConnectionManager] - Driver inicializado com sucesso.");
		System.out
				.println("[ConnectionManager] - Obtendo conexao com o banco...");
		System.out.println("[ConnectionManager] - URL: " + STR_CON);
		
		// Verificando se a conexao sera estabelecida
		try {
			this.con = DriverManager.getConnection(STR_CON);
		} catch (SQLException e) {
			throw new SimpleCookBookException();
		}
		
		// Avisando que esta conectado ao banco de dados
		System.out.println("[ConnectionManager] - Conexao Obtida com sucesso!");

		// Verificando se tera algum acesso de escrita ou consulta no banco
		try {
			this.stmt = con.createStatement();
		} catch (SQLException e) {
			throw new SimpleCookBookException();
		}

	}

	/**
	 * @see org.ybacoby.simplecookbook.database.IDataBase#insertSqlDatabase(java.lang.String)
	 */
	public void insertSqlDatabase(String sql) throws SimpleCookBookException {
		try {
			//this.stmt.executeQuery(sql);
			this.stmt.executeUpdate(sql);
		} catch (SQLException e) {
			//e.printStackTrace();
			throw new SimpleCookBookException(e.getLocalizedMessage());
		}

	}

	/**
	 * @see org.ybacoby.simplecookbook.database.IDataBase#selectSqlDatabase(java.lang.String)
	 */
	public ResultSet selectSqlDatabase(String sql) throws SimpleCookBookException {
		try {
			ResultSet rs = this.stmt.executeQuery(sql);
			return rs;
		} catch (SQLException e) {
			throw new SimpleCookBookException(e.getLocalizedMessage());
		}
	}

	/**
	 * @see org.ybacoby.simplecookbook.database.IDataBase#sqlDataTime()
	 */
	public String sqlDataTime() throws SimpleCookBookException {
		// Definindo que o calendario que sera usado sera o Gregoriano
		Calendar ca = GregorianCalendar.getInstance();
		
		// Capturando o tempo da maquina
		java.util.Date data = ca.getTime();
		
		java.sql.Date sqlData = new java.sql.Date(data.getTime());

		// Definindo o forma de uso da data
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		// Verificando se o valor sera nulo, caso seja joga uma excessao
		if (formato.format(sqlData).equals(null)) throw new SimpleCookBookException();
		
		// Retornar a data atual
		return formato.format(sqlData);
	}

	/**
	 * @see org.ybacoby.simplecookbook.database.IDataBase#totalItensDataSql(org.ybacoby.simplecookbook.database.EnumTabelaDataBase)
	 */
	public int totalItensDataSql(EnumTabelaDataBase tabela)
			throws SimpleCookBookException {

		// O valor do resultado
		int resultado = 0;
		
		// O SQL que sera usado para a pesquisa
		String sql;
		
		// Onde sera quardado o resultado da pesquisa
		ResultSet rs;
		
		switch (tabela) {
		case INGREDIENTE:
			sql = "SELECT COUNT(*) AS QTD FROM INGREDIENTES;";
			break;

		case RECEITA:
			sql = "SELECT COUNT(*) AS QTD FROM RECEITAS;";
			break;
		default:
			throw new SimpleCookBookException();
		}
		
		// Executando o a pesquisa para saber a quantidade de uma dada entidade no banco de dados 
		try {
			rs = this.selectSqlDatabase(sql);
			
			while (rs.next()) {
				resultado = rs.getInt("QTD");
			}
			return resultado;
		} catch (SQLException e) {
			e.printStackTrace();
			
			// Caso ocorra algum erro em relacao ao SQL cadastrado
			throw new SimpleCookBookException();
		}
	}

}
